package com.gexin.controller.xapp.order;

import com.gexin.common.utils.RedisLockTool;
import com.gexin.common.utils.StringUtil;
import com.gexin.common.utils.UUIDUtils;
import com.gexin.core.web.AppController;
import com.gexin.model.activity.MemberBillShopLog;
import com.gexin.model.activity.MemberBillSpeedIntegral;
import com.gexin.model.order.Order;
import com.gexin.model.order.OrderItem;
import com.gexin.model.order.OrderPresale;
import com.gexin.model.product.Products;
import com.gexin.service.memberAcitivty.IntegralService;
import com.gexin.weixin.kit.WeiXinUtils;
import com.jfinal.ext.route.ControllerBind;
import com.jfinal.kit.JsonKit;
import com.jfinal.log.Log;

import javax.servlet.http.HttpServletRequest;
import java.io.IOException;
import java.math.BigDecimal;
import java.util.*;

/**
 * 支付宝支付成功回调
 *
 * @author 肖得明
 */
@ControllerBind(controllerKey = "/xapp/order/alipay/callback")
public class AliPayCallBackController extends AppController {
	static Log log = Log.getLog(AliPayCallBackController.class);

	//用户登录
	public void index() throws IOException {
		log.info("支付宝回掉控制器！");
		String lock_key = "cache:alipay:order:lock:";
		HttpServletRequest request = getRequest();
		//获取支付宝POST过来反馈信息
		Map<String, String> params = new HashMap<String, String>();
		Map requestParams = request.getParameterMap();
		for (Iterator iter = requestParams.keySet().iterator(); iter.hasNext(); ) {
			String name = (String) iter.next();
			String[] values = (String[]) requestParams.get(name);
			String valueStr = "";
			for (int i = 0; i < values.length; i++) {
				valueStr = (i == values.length - 1) ? valueStr + values[i]
						: valueStr + values[i] + ",";
			}
			params.put(name, valueStr);
		}
		//System.err.println(JsonKit.toJson(params));
		//获取支付宝的通知返回参数，可参考技术文档中页面跳转同步通知参数列表(以下仅供参考)//
		//商户订单号
		String out_trade_no = request.getParameter("out_trade_no");
		String trade_no = request.getParameter("trade_no");
		//判断空指针
		if (StringUtil.show(out_trade_no).equals("") || StringUtil.show(trade_no).equals("")) {
			getResponse().getWriter().println("fail");
			return;
		}
		out_trade_no = new String(out_trade_no.getBytes("ISO-8859-1"), "UTF-8");
		trade_no = new String(trade_no.getBytes("ISO-8859-1"), "UTF-8");

		log.info(String.format("out_trade_no:%s，trade_no:%s", out_trade_no, trade_no));
		//支付宝交易号
		//交易状态
		String trade_status = new String(request.getParameter("trade_status").getBytes("ISO-8859-1"), "UTF-8");
		//获取支付宝的通知返回参数，可参考技术文档中页面跳转同步通知参数列表(以上仅供参考)//
		if (1 == 1) {
			//if(AlipayNotify.verify(params)){
			//验证成功
			//////////////////////////////////////////////////////////////////////////////////////////
			//请在这里加上商户的业务逻辑程序代码
			log.info("支付宝验证签名成功" + out_trade_no);
			//——请根据您的业务逻辑来编写程序（以下代码仅作参考）——
			if (trade_status.equals("TRADE_FINISHED")) {
				log.info("支付宝TRADE_FINISHED" + out_trade_no);
			} else if (trade_status.equals("TRADE_SUCCESS")) {
				log.info("支付宝TRADE_SUCCESS" + out_trade_no);
				log.info(JsonKit.toJson(params));
				String money = params.get("buyer_pay_amount");
				if (StringUtil.isBlank(money)) {
					// 有buyer_pay_amount的情况下 是 H5支付 
					money = params.get("total_amount");
					if (money == null) {
						money = params.get("total_fee");
					}
				}

				Integer total_fee = (int) (Double.parseDouble(money) * 100);
				//out_trade_no, trade_no, total_fee,
				//处理自己的业务逻辑
				lock_key = lock_key + out_trade_no;
				boolean lock_get_state = RedisLockTool.getLock(lock_key, 5000);  //获取锁
				if (lock_get_state) {
					Order order = Order.dao.findById(out_trade_no);
					if (order == null) {
						log.error("app支付宝支付回调发生异常错误:  订单不存在" + out_trade_no + "  ， trade_no:" + trade_no);
						getResponse().getWriter().println("fail");
						return;
					}
					if (order.getPayState().intValue() >0) {
						log.error("APP支付宝订单已经被支付处理过了 " + out_trade_no + " ，  trade_no:" + trade_no);
						getResponse().getWriter().println("fail");
						return;
					}
					Order order_new = new Order();
					order_new.setId(order.getId());
					order_new.setPayTime(new Date());
					order_new.setPayState(2);
					order_new.setPayType(3);
					order_new.setTransactionId(trade_no);
					order_new.setState(order.State_Wait_Send_Express);
					order_new.setTotalFee(total_fee);

					Integer userId = order_new.getUserId();
//					if(userId!=null){
//						String id = order_new.getId();
//						List<OrderItem> orderItemByOrderId = OrderItem.dao.findOrderItemByOrderId(id);
//						for(int i=0;i<orderItemByOrderId.size();i++) {
//							OrderItem orderItem = orderItemByOrderId.get(i);
//							Integer productId = orderItem.getProductId();
//							Products products = Products.dao.findById(productId);
//							MemberBillSpeedIntegral memberBillSpeedIntegral = new MemberBillSpeedIntegral();
//							memberBillSpeedIntegral.setId(UUIDUtils.getUUID()+"");
//							int integral = memberBillSpeedIntegral.getSpeedIntegral() + products.getIntegral();
//							int incrementIntegral = memberBillSpeedIntegral.getSpeedIntegral() == null ? 0 : memberBillSpeedIntegral.getSpeedIntegral();
//							memberBillSpeedIntegral.setUserId(order_new.getUserId()+"");
//							long date = new Date().getTime();
//							memberBillSpeedIntegral.setUpdateTime(date);
//							memberBillSpeedIntegral.update();
//							MemberBillShopLog memberBillShopLog = new MemberBillShopLog();
//							memberBillShopLog.setId(UUIDUtils.getUUIDInOrderId()+"");
//							memberBillShopLog.setComeIn(1);
//							memberBillShopLog.setCreateTime(date);
//							memberBillShopLog.setUpdateTime(date);
//							memberBillShopLog.setIncrement(integral);
//							memberBillShopLog.setIntegralIncrement(incrementIntegral);
//							memberBillShopLog.setDesc("购买商品"+productId+",增加兑货券");
//							memberBillShopLog.save();
//						}
//					}

					if(order.getType()==2){
						OrderPresale presale =OrderPresale.dao.findByOrderIdAndType(order.getId(),1);
						if(presale!=null){
							if(presale.getState()==1){
								order_new.setPayState(1);
								presale.setState(2);
								presale.setTransactionId(trade_no);
								presale.setPayMoney(new BigDecimal(total_fee/100+""));
								presale.setPayTime(new Date());
								presale.update();
							}else{
								log.error("商品APP支付宝支付回调方法，order_id："+order_new.getId()+"，在 OrderPresale 表中 订金状态显示已支付 ！ ");
								getResponse().getWriter().println("fail");
								return;
							}
						}else{
							log.error("商品APP支付宝支付回调方法，order_id："+order_new.getId()+"，在 OrderPresale 表未找到数据 ！ ");
							getResponse().getWriter().println("fail");
							return;
						}
					}
					if (order_new.update()) {
						IntegralService inviterService = new IntegralService();
						inviterService.confirmDelivery(order, order.getUserId() + "");
						//处理成功
						renderText("success");
					} else {
						log.error("订单修改保存失败! " + out_trade_no + "  ， trade_no:" + trade_no);
						getResponse().getWriter().println("fail");
						return;
					}
				}else{
					getResponse().getWriter().println("fail");
					return;
				}
			} else {
				//支付过了
				//getResponse().getWriter().println("success");	//请不要修改或删除
				renderText("success");
			}
			//判断该笔订单是否在商户网站中已经做过处理
			//如果没有做过处理，根据订单号（out_trade_no）在商户网站的订单系统中查到该笔订单的详细，并执行商户的业务程序
			//如果有做过处理，不执行商户的业务程序
			//注意：
			//该种交易状态只在一种情况下出现——开通了高级即时到账，买家付款成功后。
		} else {
			//验证失败
			log.info("支付宝验证失败" + out_trade_no);
			renderText("fail");
		}
		//——请根据您的业务逻辑来编写程序（以上代码仅作参考）——
		//////////////////////////////////////////////////////////////////////////////////////////
	}


	//预售商品尾款回调
	public void tail_app() throws IOException{
		log.info("预售商品尾款回调 支付宝回掉控制器！");
		String lock_key = "cache:alipay:order:lock:";
		HttpServletRequest request = getRequest();
		//获取支付宝POST过来反馈信息
		Map<String, String> params = new HashMap<String, String>();
		Map requestParams = request.getParameterMap();
		for (Iterator iter = requestParams.keySet().iterator(); iter.hasNext(); ) {
			String name = (String) iter.next();
			String[] values = (String[]) requestParams.get(name);
			String valueStr = "";
			for (int i = 0; i < values.length; i++) {
				valueStr = (i == values.length - 1) ? valueStr + values[i]
						: valueStr + values[i] + ",";
			}
			params.put(name, valueStr);
		}
		//System.err.println(JsonKit.toJson(params));
		//获取支付宝的通知返回参数，可参考技术文档中页面跳转同步通知参数列表(以下仅供参考)//
		//商户订单号
		String out_trade_no = request.getParameter("out_trade_no");
		String trade_no = request.getParameter("trade_no");
		//判断空指针
		if (StringUtil.show(out_trade_no).equals("") || StringUtil.show(trade_no).equals("")) {
			getResponse().getWriter().println("fail");
			return;
		}
		out_trade_no = new String(out_trade_no.getBytes("ISO-8859-1"), "UTF-8");
		trade_no = new String(trade_no.getBytes("ISO-8859-1"), "UTF-8");

		log.info(String.format("out_trade_no:%s，trade_no:%s", out_trade_no, trade_no));
		//支付宝交易号
		//交易状态
		String trade_status = new String(request.getParameter("trade_status").getBytes("ISO-8859-1"), "UTF-8");
		//获取支付宝的通知返回参数，可参考技术文档中页面跳转同步通知参数列表(以上仅供参考)//
		if (1 == 1) {
			//if(AlipayNotify.verify(params)){
			//验证成功
			//////////////////////////////////////////////////////////////////////////////////////////
			//请在这里加上商户的业务逻辑程序代码
			log.info("支付宝验证签名成功" + out_trade_no);
			//——请根据您的业务逻辑来编写程序（以下代码仅作参考）——
			if (trade_status.equals("TRADE_FINISHED")) {
				log.info("支付宝TRADE_FINISHED" + out_trade_no);
			} else if (trade_status.equals("TRADE_SUCCESS")) {
				log.info("支付宝TRADE_SUCCESS" + out_trade_no);
				log.info(JsonKit.toJson(params));
				String money = params.get("buyer_pay_amount");
				if (StringUtil.isBlank(money)) {
					// 有buyer_pay_amount的情况下 是 H5支付
					money = params.get("total_amount");
					if (money == null) {
						money = params.get("total_fee");
					}
				}

				Integer total_fee = (int) (Double.parseDouble(money) * 100);
				//out_trade_no, trade_no, total_fee,
				//处理自己的业务逻辑
				lock_key = lock_key + out_trade_no;
				boolean lock_get_state = RedisLockTool.getLock(lock_key, 5000);  //获取锁
				if (lock_get_state) {
					//这里注释下  尾款传入过来的订单号 后面带了 t_order_presale 主键ID
					out_trade_no=out_trade_no.split("_")[0];
					Order order = Order.dao.findById(out_trade_no);
					if (order == null) {
						log.error("支付回调发生异常错误:  订单不存在" + out_trade_no + "   trade_no:" + trade_no);
						renderXml(WeiXinUtils.wxPayResponse("FAIL", ""));
						return;
					}
					if (order.getPayState() != 1 && !order.getState().equals(order.State_Wait_Send_Express)) {
						log.error("订单已经被支付处理过了 " + out_trade_no + "   trade_no:" + trade_no);
						renderXml(WeiXinUtils.wxPayResponse("FAIL", ""));
						return;
					}
					Order order_new = new Order();
					order_new.setId(order.getId());
					order_new.setPayTime(new Date());
					order_new.setPayState(2);
					order_new.setPayType(3);
					order_new.setTransactionId(trade_no);
					order_new.setState(order.State_Wait_Pay);
					order_new.setTotalFee(total_fee);

					//修改状态
					OrderPresale presale =OrderPresale.dao.findByOrderIdAndType(order.getId(),2);
					if(presale==null){
						log.error("订单： " + out_trade_no + "   transaction_id:" + trade_no+"，OrderPresale 没有找到数据！");
						renderText(WeiXinUtils.wxPayResponse("FAIL", ""));
					}
					presale.setTransactionId(trade_no);
					presale.setState(2);
					presale.setPayTime(new Date());
					presale.setPayMoney(new BigDecimal(total_fee+"").divide(new BigDecimal("100")));
					presale.update();
					if (order_new.update()) {
						IntegralService inviterService = new IntegralService();
						inviterService.confirmDelivery(order, order.getUserId() + "");
						//处理成功
						renderText("success");
					} else {
						log.error("订单修改保存失败! " + out_trade_no + "  ， trade_no:" + trade_no);
						getResponse().getWriter().println("fail");
						return;
					}
				}else{
					getResponse().getWriter().println("fail");
					return;
				}
			} else {
				//支付过了
				//getResponse().getWriter().println("success");	//请不要修改或删除
				renderText("success");
			}
			//判断该笔订单是否在商户网站中已经做过处理
			//如果没有做过处理，根据订单号（out_trade_no）在商户网站的订单系统中查到该笔订单的详细，并执行商户的业务程序
			//如果有做过处理，不执行商户的业务程序
			//注意：
			//该种交易状态只在一种情况下出现——开通了高级即时到账，买家付款成功后。
		} else {
			//验证失败
			log.info("支付宝验证失败" + out_trade_no);
			renderText("fail");
		}
		//——请根据您的业务逻辑来编写程序（以上代码仅作参考）——
		//////////////////////////////////////////////////////////////////////////////////////////
	}
	
	/*{
		"buyer_id": "2088312811126168",
		"body": "测试商品信息",
		"trade_no": "2017080621001004160204909369",
		"use_coupon": "N",
		"notify_time": "2017-08-06 21:54:52",
		"subject": "天天拼好货商品购买",
		"sign_type": "RSA",
		"is_total_fee_adjust": "N",
		"notify_type": "trade_status_sync",
		"out_trade_no": "3232221554556478811",
		"gmt_payment": "2017-08-06 21:54:52",
		"trade_status": "TRADE_SUCCESS",
		"discount": "0.00",
		"sign": "HuEnrSUQRt5DYKvbcUJ/rUTS/WzvcsfvwAiwBQNawZ0hzMNfHESiyOM7BqD1ATCL7gHXOAcU3Yg9BEW3PDB+j4IHtoWKWmuWHNyFmpaz1rDJSMpCXR/iPoK40oAwhr1NY+YchP/5jdv49AwpwA6qZb5nxefw6nPEcXi/c4Rb1AQ=",
		"gmt_create": "2017-08-06 21:54:52",
		"buyer_email": "1786210025@qq.com",
		"price": "0.01",
		"total_fee": "0.01",
		"seller_id": "2088312327296955",
		"quantity": "1",
		"notify_id": "91b53447daa5e3a1de8429db6be97e3h8i",
		"seller_email": "18651707070@qq.com",
		"payment_type": "1"
	}*/
}
